Q:
ÉÜÅ[ÉUãÛä‘Çà I/O Kit ÉRÅ[Éhì‡Ç≈ io_object_t ÉIÉuÉWÉFÉNÉgÇÉäÅ[ÉNǵǃǢÇÈÇÊǧDžévǢNjÇ∑ÅBä÷êî IOObjectGetRetainCount ÇégópǵǃDZÇÍÇÁÇÃÉIÉuÉWÉFÉNÉgÇÃï€éùÉJÉEÉìÉgÇéÊìæÇµÇ‹ÇµÇΩÇ™ÅAó\ëzÇÊÇËLJëÂÇ´Ç¢ílÇ™ñflÇ≥ÇÍÇÈÇÃÇ≈Ç∑ÅBDZÇÍÇÕÇ»Ç∫Ç≈Ç∑Ç©ÅH A:
DZDZÇ≈ä÷òAÇ∑ÇÈï€éùÉJÉEÉìÉgÇÕÅAé¿ç€Ç…ÇÕ 2 ǬdžÇËÇ‹Ç∑ÅB1 ǬÇÕÅAio_object_t Ç…ÇÊǡǃï\åªÇ≥ÇÍÇÈÅAäÓî’ÇÃÉJÅ[ÉlÉãÉIÉuÉWÉFÉNÉgÇÃï€éùÉJÉEÉìÉgÇ≈Ç∑ÅBä÷êî IOObjectGetRetainCount ÇÕÅAÉJÅ[ÉlÉãÇåƒÇ—èoÇ∑DZÇΔÇ…ÇÊǡǃÅADZÇÃï€éùÉJÉEÉìÉgÇñflǵNjÇ∑ÅB LJǧ 1 ǬÇÕÅAio_object_t é©êgÇÃï€éùÉJÉEÉìÉgÇ≈Ç∑ÅBio_object_t ÇÕÅAÉÜÅ[ÉUãÛä‘ÇΔÉJÅ[ÉlÉãÇΔÇÃÇ‚ÇËéÊÇËégÇÌÇÍÇÈ Mach É|Å[ÉgÇÃÉâÉbÉpÅ[Ç≈džÇËÅAMach É|Å[ÉgÇÕǪÇÍǺÇÍêÍópÇÃï€éùÉJÉEÉìÉgÇéùǡǃǢNjÇ∑ÅBDZÇÍÇÕÅAio_object_t Ç©ÇÁîhê∂ǵÇΩëºÇÃå^ÅAÇ∑Ç»ÇÌÇø io_service_tÅAio_connect_tÅAio_iterator_tÅAio_registry_entry_t ÅAio_enumerator_t DžLJìñǃÇÕÇ‹ÇËÇ‹Ç∑Å@(DZÇÍÇÁÇÃå^ÇÕÅAIOKit/IOTypes.h ÇÃíÜÇ≈íËã`Ç≥ÇÍǃǢNjÇ∑)ÅB IOObjectRetain ÇΔ IOObjectRelease ÇÕÅAio_object_t Çà Mach É|Å[Égé©êgÇÃï€éùÉJÉEÉìÉgÇëŒè€Ç…èàóùÇçsǢNjÇ∑ÅBDZÇÍÇÕÅADarwin Çà IOKitUser ÉvÉçÉWÉFÉNÉgÇÃíÜÇà IOKitLib.c Çí≤Ç◊ÇÈDZÇΔÇ≈ämîFÇ≈Ç´Ç‹Ç∑ÅB ǵÇΩǙǡǃÅAio_object_t ÇÃï€éùÉJÉEÉìÉgÇéÊìæÇ∑ÇÈê≥ǵǢï˚ñ@ÇÕÅAMach ä÷êî mach_port_get_refs ÇÅAÉäÉXÉg 1 ÇÃÇÊǧDžégópÇ∑ÇÈDZÇΔÇ≈Ç∑ÅB
#include <IOKit/IOKitLib.h>
#include <mach/mach_port.h>
kern_return_t kr;
unsigned int result;
io_object_t theObject;
io_name_t className;
kr = IOObjectGetClass(theObject, className);
if (KERN_SUCCESS == kr)
{
kern_return_t kr2;
kr2 = mach_port_get_refs(
mach_task_self(),
theObject,
MACH_PORT_RIGHT_SEND,
&result );
printf(
"ID: %#X, Class: %s, Retain Count: %d, Result=%#x\n",
theObject, className, result, kr2);
}
|
ÉäÉXÉg 1Å@io_object_t ÇÃï€éùÉJÉEÉìÉgÇÃéÊìæ |
ÇÊÇ≠ímÇÁÇÍǃǢÇÈÉäÉ^Å[ÉìÉRÅ[Éh 0x10000003 (MACH_SEND_INVALID_DEST) Ç™ IOKit.framework ä÷êîÇ©ÇÁñflÇ≥ÇÍÇΩèÍçáÅADZÇÍÇÕÅAäÓî’ÇÃÉJÅ[ÉlÉãÉIÉuÉWÉFÉNÉgÇ≈ÇÕÇ»Ç≠ÅAîjä¸Ç≥ÇÍÇΩ io_object_t ÇéQèΔǵǃǢNjÇ∑ÅBI/O Kit ÇÃÉGÉâÅ[ÉRÅ[ÉhÇÃè⁄ç◊DžǬǢǃÇÕÅAÉeÉNÉjÉJÉã Q&A 1075 ÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB
[2002 îN 9 åé 4 ì˙] |